(function($, win, undef) {
    var errorobj = null, msgobj = null, msghidden = true;
    var r = document.referrer;
    var tw = "zh_TW";
    var cn = "zh_CN";
    var us = "en_US";
    var jp = "ja_jP";
    var nullmsg = "不能为空！";
    var specialmsg = "不能输入特殊字符！";
    var phonemsg = "请填写手机号码！";
    var mailmsg = "邮箱地址格式不对！";
    var defmsg = "请填写正确信息！";
    var reckmsg = "两次输入的内容不一致！";
    var rmsg = "通过信息验证！";
    var cmsg = "正在检测信息…";
    var  vmsg = "正在验证，请稍后…";
    var pmsg = "正在提交数据…";
//    $.get("/member/localSession.do", function(data) {
//        if (data.locale.toLowerCase() == tw.toLowerCase()) {
//            nullmsg = "不能為空！";
//            specialmsg = "不能輸入特殊字元！";
//            phonemsg = "請填寫手機號碼！";
//            mailmsg = "郵箱位址格式不對！";
//            defmsg = "請填寫正確資訊！";
//            reckmsg = "兩次輸入的內容不一致！";
//            rmsg = "通過資訊驗證！";
//            cmsg = "正在檢測資訊...";
//            vmsg = "正在驗證，請稍候...";
//            pmsg = "正在提交資料...";
//        } else if (data.locale.toLowerCase() == cn.toLowerCase()) {
//            nullmsg = "不能为空！";
//            specialmsg = "不能输入特殊字符！";
//            phonemsg = "请填写手机号码！";
//            mailmsg = "邮箱地址格式不对！";
//            defmsg = "请填写正确信息！";
//            reckmsg = "两次输入的内容不一致！";
//            rmsg = "通过信息验证！";
//            cmsg = "正在检测信息…";
//            vmsg = "正在验证，请稍后…";
//            pmsg = "正在提交数据…";
//        } else if (data.locale.toLowerCase() == us.toLowerCase()) {
//            nullmsg = "Can't be empty!";
//            specialmsg = "Cannot enter special characters!";
//            phonemsg = "Please fill in the phone number!";
//            mailmsg = "The mailbox address format is wrong!";
//            defmsg = "Please fill in the correct information!";
//            reckmsg = "Two times the contents of the input inconsistent!";
//            rmsg = "Verify through information!";
//            cmsg = "Detecting information ...";
//            vmsg = "Verifying, please wait ...";
//            pmsg = "Submitting data ...";
//        } else if (data.locale.toLowerCase() == jp.toLowerCase()) {
//            nullmsg = "空にすることはできません!";
//            specialmsg = "特殊文字を入力できません!";
//            phonemsg = "電話番号を記入してください!";
//            mailmsg = "メールボックスのアドレスの形式が間違っています!";
//            defmsg = "正しい情報を入力してください!";
//            reckmsg = "入力の2倍の内容が矛盾!";
//            rmsg = "情報を通して確認!";
//            cmsg = "情報の検出…";
//            vmsg = "確認しています。";
//            pmsg = "データを送信しています。";
//        }
//    });
    var tipmsg = {
        tit: "提示信息",
        w: {
            "*": nullmsg,
            "*6-16": "请填写6到16位任意字符！",
            n: "请填写数字！",
            "n6-16": "请填写6到16位数字！",
            s: specialmsg,
            "s6-18": "请填写6到18位字符！",
            p: "请填写邮政编码！",
            m: phonemsg,
            e: mailmsg,
            url: "请填写网址！"
        },
        def: defmsg,
        undef: "datatype未定义！",
        reck: reckmsg,
        r: rmsg,
        c: cmsg,
        s: "请{填写|选择}{0|信息}！",
        v: vmsg,
        p: pmsg
    };
    $.Tipmsg = tipmsg;
    var Validform = function(forms, settings, inited) {
        var settings = $.extend({}, Validform.defaults, settings);
        settings.datatype && $.extend(Validform.util.dataType, settings.datatype);
        var brothers = this;
        brothers.tipmsg = {
            w: {}
        };
        brothers.forms = forms;
        brothers.objects = [];
        if (inited === true) {
            return false;
        }
        forms.each(function() {
            if (this.validform_inited == "inited") {
                return true;
            }
            this.validform_inited = "inited";
            var curform = this;
            curform.settings = $.extend({}, settings);
            var $this = $(curform);
            curform.validform_status = "normal";
            $this.data("tipmsg", brothers.tipmsg);
            $this.delegate("[datatype]", "blur", function() {
                var subpost = arguments[1];
                Validform.util.check.call(this, $this, subpost);
            });
            $this.delegate(":text", "keypress", function(event) {
                if (event.keyCode == 13 && $this.find(":submit").length == 0) {
                    $this.submit();
                }
            });
            Validform.util.enhance.call($this, curform.settings.tiptype, curform.settings.usePlugin, curform.settings.tipSweep);
            curform.settings.btnSubmit && $this.find(curform.settings.btnSubmit).bind("click", function() {
                $this.trigger("submit");
                return false;
            });
            $this.submit(function() {
                var subflag = Validform.util.submitForm.call($this, curform.settings);
                subflag === undef && (subflag = true);
                return subflag;
            });
            $this.find("[type='reset']").add($this.find(curform.settings.btnReset)).bind("click", function() {
                Validform.util.resetForm.call($this);
            });
        });
        if (settings.tiptype == 1 || (settings.tiptype == 2 || settings.tiptype == 3) && settings.ajaxPost) {
            creatMsgbox();
        }
    };
    Validform.defaults = {
        tiptype: 1,
        tipSweep: false,
        showAllError: false,
        postonce: false,
        ajaxPost: false
    };
    Validform.util = {
        dataType: {
            "*": /[\w\W]+/,
            "*6-16": /^[\w\W]{6,16}$/,
            n: /^\d+$/,
            "n6-16": /^\d{6,16}$/,
            s: /^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]+$/,
            "s6-18": /^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]{6,18}$/,
            p: /^[0-9]{6}$/,
            m: /^13[0-9]{9}$|14[0-9]{9}|15[0-9]{9}$|18[0-9]{9}$/,
            e: /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
            url: /^(\w+:\/\/)?\w+(\.\w+)+.*$/
        },
        toString: Object.prototype.toString,
        isEmpty: function(val) {
            return val === "" || val === $.trim(this.attr("tip"));
        },
        getValue: function(obj) {
            var inputval, curform = this;
            if (obj.is(":radio")) {
                inputval = curform.find(":radio[name='" + obj.attr("name") + "']:checked").val();
                inputval = inputval === undef ? "" : inputval;
            } else if (obj.is(":checkbox")) {
                inputval = "";
                curform.find(":checkbox[name='" + obj.attr("name") + "']:checked").each(function() {
                    inputval += $(this).val() + ",";
                });
                inputval = inputval === undef ? "" : inputval;
            } else {
                inputval = obj.val();
            }
            inputval = $.trim(inputval);
            return Validform.util.isEmpty.call(obj, inputval) ? "" : inputval;
        },
        enhance: function(tiptype, usePlugin, tipSweep, addRule) {
            var curform = this;
            curform.find("[datatype]").each(function() {
                if (tiptype == 2) {
                    if ($(this).parent().next().find(".Validform_checktip").length == 0) {
                        $(this).parent().next().append("<span class='Validform_checktip' />");
                        $(this).siblings(".Validform_checktip").remove();
                    }
                } else if (tiptype == 3 || tiptype == 4) {
                    if ($(this).siblings(".Validform_checktip").length == 0) {
                        $(this).parent().append("<span class='Validform_checktip' />");
                        $(this).parent().next().find(".Validform_checktip").remove();
                    }
                }
            });
            curform.find("input[recheck]").each(function() {
                if (this.validform_inited == "inited") {
                    return true;
                }
                this.validform_inited = "inited";
                var _this = $(this);
                var recheckinput = curform.find("input[name='" + $(this).attr("recheck") + "']");
                recheckinput.bind("keyup", function() {
                    if (recheckinput.val() == _this.val() && recheckinput.val() != "") {
                        if (recheckinput.attr("tip")) {
                            if (recheckinput.attr("tip") == recheckinput.val()) {
                                return false;
                            }
                        }
                        _this.trigger("blur");
                    }
                }).bind("blur", function() {
                    if (recheckinput.val() != _this.val() && _this.val() != "") {
                        if (_this.attr("tip")) {
                            if (_this.attr("tip") == _this.val()) {
                                return false;
                            }
                        }
                        _this.trigger("blur");
                    }
                });
            });
            curform.find("[tip]").each(function() {
                if (this.validform_inited == "inited") {
                    return true;
                }
                this.validform_inited = "inited";
                var defaultvalue = $(this).attr("tip");
                var altercss = $(this).attr("altercss");
                $(this).focus(function() {
                    if ($(this).val() == defaultvalue) {
                        $(this).val("");
                        if (altercss) {
                            $(this).removeClass(altercss);
                        }
                    }
                }).blur(function() {
                    if ($.trim($(this).val()) === "") {
                        $(this).val(defaultvalue);
                        if (altercss) {
                            $(this).addClass(altercss);
                        }
                    }
                });
            });
            curform.find(":checkbox[datatype],:radio[datatype]").each(function() {
                if (this.validform_inited == "inited") {
                    return true;
                }
                this.validform_inited = "inited";
                var _this = $(this);
                var name = _this.attr("name");
                curform.find("[name='" + name + "']").filter(":checkbox,:radio").bind("click", function() {
                    setTimeout(function() {
                        _this.trigger("blur");
                    }, 0);
                });
            });
            curform.find("select[datatype][multiple]").bind("click", function() {
                var _this = $(this);
                setTimeout(function() {
                    _this.trigger("blur");
                }, 0);
            });
            Validform.util.usePlugin.call(curform, usePlugin, tiptype, tipSweep, addRule);
        },
        usePlugin: function(plugin, tiptype, tipSweep, addRule) {
            var curform = this, plugin = plugin || {};
            if (curform.find("input[plugin='swfupload']").length && typeof swfuploadhandler != "undefined") {
                var custom = {
                    custom_settings: {
                        form: curform,
                        showmsg: function(msg, type, obj) {
                            Validform.util.showmsg.call(curform, msg, tiptype, {
                                obj: curform.find("input[plugin='swfupload']"),
                                type: type,
                                sweep: tipSweep
                            });
                        }
                    }
                };
                custom = $.extend(true, {}, plugin.swfupload, custom);
                curform.find("input[plugin='swfupload']").each(function(n) {
                    if (this.validform_inited == "inited") {
                        return true;
                    }
                    this.validform_inited = "inited";
                    $(this).val("");
                    swfuploadhandler.init(custom, n);
                });
            }
            if (curform.find("input[plugin='datepicker']").length && $.fn.datePicker) {
                plugin.datepicker = plugin.datepicker || {};
                if (plugin.datepicker.format) {
                    Date.format = plugin.datepicker.format;
                    delete plugin.datepicker.format;
                }
                if (plugin.datepicker.firstDayOfWeek) {
                    Date.firstDayOfWeek = plugin.datepicker.firstDayOfWeek;
                    delete plugin.datepicker.firstDayOfWeek;
                }
                curform.find("input[plugin='datepicker']").each(function(n) {
                    if (this.validform_inited == "inited") {
                        return true;
                    }
                    this.validform_inited = "inited";
                    plugin.datepicker.callback && $(this).bind("dateSelected", function() {
                        var d = new Date($.event._dpCache[this._dpId].getSelected()[0]).asString(Date.format);
                        plugin.datepicker.callback(d, this);
                    });
                    $(this).datePicker(plugin.datepicker);
                });
            }
            if (curform.find("input[plugin*='passwordStrength']").length && $.fn.passwordStrength) {
                plugin.passwordstrength = plugin.passwordstrength || {};
                plugin.passwordstrength.showmsg = function(obj, msg, type) {
                    Validform.util.showmsg.call(curform, msg, tiptype, {
                        obj: obj,
                        type: type,
                        sweep: tipSweep
                    });
                };
                curform.find("input[plugin='passwordStrength']").each(function(n) {
                    if (this.validform_inited == "inited") {
                        return true;
                    }
                    this.validform_inited = "inited";
                    $(this).passwordStrength(plugin.passwordstrength);
                });
            }
            if (addRule != "addRule" && plugin.jqtransform && $.fn.jqTransSelect) {
                if (curform[0].jqTransSelected == "true") {
                    return;
                }
                curform[0].jqTransSelected = "true";
                var jqTransformHideSelect = function(oTarget) {
                    var ulVisible = $(".jqTransformSelectWrapper ul:visible");
                    ulVisible.each(function() {
                        var oSelect = $(this).parents(".jqTransformSelectWrapper:first").find("select").get(0);
                        if (!(oTarget && oSelect.oLabel && oSelect.oLabel.get(0) == oTarget.get(0))) {
                            $(this).hide();
                        }
                    });
                };
                var jqTransformCheckExternalClick = function(event) {
                    if ($(event.target).parents(".jqTransformSelectWrapper").length === 0) {
                        jqTransformHideSelect($(event.target));
                    }
                };
                var jqTransformAddDocumentListener = function() {
                    $(document).mousedown(jqTransformCheckExternalClick);
                };
                if (plugin.jqtransform.selector) {
                    curform.find(plugin.jqtransform.selector).filter('input:submit,input:reset,input[type="button"]').jqTransInputButton();
                    curform.find(plugin.jqtransform.selector).filter("input:text, input:password").jqTransInputText();
                    curform.find(plugin.jqtransform.selector).filter("input:checkbox").jqTransCheckBox();
                    curform.find(plugin.jqtransform.selector).filter("input:radio").jqTransRadio();
                    curform.find(plugin.jqtransform.selector).filter("textarea").jqTransTextarea();
                    if (curform.find(plugin.jqtransform.selector).filter("select").length > 0) {
                        curform.find(plugin.jqtransform.selector).filter("select").jqTransSelect();
                        jqTransformAddDocumentListener();
                    }
                } else {
                    curform.jqTransform();
                }
                curform.find(".jqTransformSelectWrapper").find("li a").click(function() {
                    $(this).parents(".jqTransformSelectWrapper").find("select").trigger("blur");
                });
            }
        },
        getNullmsg: function(curform) {
            var obj = this;
            var reg = /[\u4E00-\u9FA5\uf900-\ufa2da-zA-Z\s]+/g;
            var nullmsg;
            var label = curform[0].settings.label || ".Validform_label";
            label = obj.siblings(label).eq(0).text() || obj.siblings().find(label).eq(0).text() || obj.parent().siblings(label).eq(0).text() || obj.parent().siblings().find(label).eq(0).text();
            label = label.replace(/\s(?![a-zA-Z])/g, "").match(reg);
            label = label ? label.join("") : [ "" ];
            reg = /\{(.+)\|(.+)\}/;
            nullmsg = curform.data("tipmsg").s || tipmsg.s;
            if (label != "") {
                nullmsg = nullmsg.replace(/\{0\|(.+)\}/, label);
                if (obj.attr("recheck")) {
                    nullmsg = nullmsg.replace(/\{(.+)\}/, "");
                    obj.attr("nullmsg", nullmsg);
                    return nullmsg;
                }
            } else {
                nullmsg = obj.is(":checkbox,:radio,select") ? nullmsg.replace(/\{0\|(.+)\}/, "") : nullmsg.replace(/\{0\|(.+)\}/, "$1");
            }
            nullmsg = obj.is(":checkbox,:radio,select") ? nullmsg.replace(reg, "$2") : nullmsg.replace(reg, "$1");
            obj.attr("nullmsg", nullmsg);
            return nullmsg;
        },
        getErrormsg: function(curform, datatype, recheck) {
            var regxp = /^(.+?)((\d+)-(\d+))?$/, regxp2 = /^(.+?)(\d+)-(\d+)$/, regxp3 = /(.*?)\d+(.+?)\d+(.*)/, mac = datatype.match(regxp), temp, str;
            if (recheck == "recheck") {
                str = curform.data("tipmsg").reck || tipmsg.reck;
                return str;
            }
            var tipmsg_w_ex = $.extend({}, tipmsg.w, curform.data("tipmsg").w);
            if (mac[0] in tipmsg_w_ex) {
                return curform.data("tipmsg").w[mac[0]] || tipmsg.w[mac[0]];
            }
            for (var name in tipmsg_w_ex) {
                if (name.indexOf(mac[1]) != -1 && regxp2.test(name)) {
                    str = (curform.data("tipmsg").w[name] || tipmsg.w[name]).replace(regxp3, "$1" + mac[3] + "$2" + mac[4] + "$3");
                    curform.data("tipmsg").w[mac[0]] = str;
                    return str;
                }
            }
            return curform.data("tipmsg").def || tipmsg.def;
        },
        _regcheck: function(datatype, gets, obj, curform) {
            var curform = curform, info = null, passed = false, reg = /\/.+\//g, regex = /^(.+?)(\d+)-(\d+)$/, type = 3;
            if (reg.test(datatype)) {
                var regstr = datatype.match(reg)[0].slice(1, -1);
                var param = datatype.replace(reg, "");
                var rexp = RegExp(regstr, param);
                passed = rexp.test(gets);
            } else if (Validform.util.toString.call(Validform.util.dataType[datatype]) == "[object Function]") {
                passed = Validform.util.dataType[datatype](gets, obj, curform, Validform.util.dataType);
                if (passed === true || passed === undef) {
                    passed = true;
                } else {
                    info = passed;
                    passed = false;
                }
            } else {
                if (!(datatype in Validform.util.dataType)) {
                    var mac = datatype.match(regex), temp;
                    if (!mac) {
                        passed = false;
                        info = curform.data("tipmsg").undef || tipmsg.undef;
                    } else {
                        for (var name in Validform.util.dataType) {
                            temp = name.match(regex);
                            if (!temp) {
                                continue;
                            }
                            if (mac[1] === temp[1]) {
                                var str = Validform.util.dataType[name].toString(), param = str.match(/\/[mgi]*/g)[1].replace("/", ""), regxp = new RegExp("\\{" + temp[2] + "," + temp[3] + "\\}", "g");
                                str = str.replace(/\/[mgi]*/g, "/").replace(regxp, "{" + mac[2] + "," + mac[3] + "}").replace(/^\//, "").replace(/\/$/, "");
                                Validform.util.dataType[datatype] = new RegExp(str, param);
                                break;
                            }
                        }
                    }
                }
                if (Validform.util.toString.call(Validform.util.dataType[datatype]) == "[object RegExp]") {
                    passed = Validform.util.dataType[datatype].test(gets);
                }
            }
            if (passed) {
                type = 2;
                info = obj.attr("sucmsg") || curform.data("tipmsg").r || tipmsg.r;
                if (obj.attr("recheck")) {
                    var theother = curform.find("input[name='" + obj.attr("recheck") + "']:first");
                    if (gets != theother.val()) {
                        passed = false;
                        type = 3;
                        info = obj.attr("errormsg") || Validform.util.getErrormsg.call(obj, curform, datatype, "recheck");
                    }
                }
            } else {
                info = info || obj.attr("errormsg") || Validform.util.getErrormsg.call(obj, curform, datatype);
                if (Validform.util.isEmpty.call(obj, gets)) {
                    info = obj.attr("nullmsg") || Validform.util.getNullmsg.call(obj, curform);
                }
            }
            return {
                passed: passed,
                type: type,
                info: info
            };
        },
        regcheck: function(datatype, gets, obj) {
            var curform = this, info = null, passed = false, type = 3;
            if (obj.attr("ignore") === "ignore" && Validform.util.isEmpty.call(obj, gets)) {
                if (obj.data("cked")) {
                    info = "";
                }
                return {
                    passed: true,
                    type: 4,
                    info: info
                };
            }
            obj.data("cked", "cked");
            var dtype = Validform.util.parseDatatype(datatype);
            var res;
            for (var eithor = 0; eithor < dtype.length; eithor++) {
                for (var dtp = 0; dtp < dtype[eithor].length; dtp++) {
                    res = Validform.util._regcheck(dtype[eithor][dtp], gets, obj, curform);
                    if (!res.passed) {
                        break;
                    }
                }
                if (res.passed) {
                    break;
                }
            }
            return res;
        },
        parseDatatype: function(datatype) {
            var reg = /\/.+?\/[mgi]*(?=(,|$|\||\s))|[\w\*-]+/g, dtype = datatype.match(reg), sepor = datatype.replace(reg, "").replace(/\s*/g, "").split(""), arr = [], m = 0;
            arr[0] = [];
            arr[0].push(dtype[0]);
            for (var n = 0; n < sepor.length; n++) {
                if (sepor[n] == "|") {
                    m++;
                    arr[m] = [];
                }
                arr[m].push(dtype[n + 1]);
            }
            return arr;
        },
        showmsg: function(msg, type, o, triggered) {
            if (msg == undef) {
                return;
            }
            if (triggered == "bycheck" && o.sweep && (o.obj && !o.obj.is(".Validform_error") || typeof type == "function")) {
                return;
            }
            $.extend(o, {
                curform: this
            });
            if (typeof type == "function") {
                type(msg, o, Validform.util.cssctl);
                return;
            }
            if (type == 1 || triggered == "byajax" && type != 4) {
                msgobj.find(".Validform_info").html(msg);
            }
            if (type == 1 && triggered != "bycheck" && o.type != 2 || triggered == "byajax" && type != 4) {
                msghidden = false;
                msgobj.find(".iframe").css("height", msgobj.outerHeight());
                msgobj.show();
                setCenter(msgobj, 100);
            }
            if (type == 2 && o.obj) {
                o.obj.parent().next().find(".Validform_checktip").html(msg);
                Validform.util.cssctl(o.obj.parent().next().find(".Validform_checktip"), o.type);
            }
            if ((type == 3 || type == 4) && o.obj) {
                o.obj.siblings(".Validform_checktip").html(msg);
                Validform.util.cssctl(o.obj.siblings(".Validform_checktip"), o.type);
            }
        },
        cssctl: function(obj, status) {
            switch (status) {
              case 1:
                obj.removeClass("Validform_right Validform_wrong").addClass("Validform_checktip Validform_loading");
                break;

              case 2:
                obj.removeClass("Validform_wrong Validform_loading").addClass("Validform_checktip Validform_right");
                break;

              case 4:
                obj.removeClass("Validform_right Validform_wrong Validform_loading").addClass("Validform_checktip");
                break;

              default:
                obj.removeClass("Validform_right Validform_loading").addClass("Validform_checktip Validform_wrong");
            }
        },
        check: function(curform, subpost, bool) {
            var settings = curform[0].settings;
            var subpost = subpost || "";
            var inputval = Validform.util.getValue.call(curform, $(this));
            if (settings.ignoreHidden && $(this).is(":hidden") || $(this).data("dataIgnore") === "dataIgnore") {
                return true;
            }
            if (settings.dragonfly && !$(this).data("cked") && Validform.util.isEmpty.call($(this), inputval) && $(this).attr("ignore") != "ignore") {
                return false;
            }
            var flag = Validform.util.regcheck.call(curform, $(this).attr("datatype"), inputval, $(this));
            if (inputval == this.validform_lastval && !$(this).attr("recheck") && subpost == "") {
                return flag.passed ? true : false;
            }
            this.validform_lastval = inputval;
            var _this;
            errorobj = _this = $(this);
            if (!flag.passed) {
                Validform.util.abort.call(_this[0]);
                if (!bool) {
                    Validform.util.showmsg.call(curform, flag.info, settings.tiptype, {
                        obj: $(this),
                        type: flag.type,
                        sweep: settings.tipSweep
                    }, "bycheck");
                    !settings.tipSweep && _this.addClass("Validform_error");
                }
                return false;
            }
            var ajaxurl = $(this).attr("ajaxurl");
            if (ajaxurl && !Validform.util.isEmpty.call($(this), inputval) && !bool) {
                var inputobj = $(this);
                if (subpost == "postform") {
                    inputobj[0].validform_subpost = "postform";
                } else {
                    inputobj[0].validform_subpost = "";
                }
                if (inputobj[0].validform_valid === "posting" && inputval == inputobj[0].validform_ckvalue) {
                    return "ajax";
                }
                inputobj[0].validform_valid = "posting";
                inputobj[0].validform_ckvalue = inputval;
                Validform.util.showmsg.call(curform, curform.data("tipmsg").c || tipmsg.c, settings.tiptype, {
                    obj: inputobj,
                    type: 1,
                    sweep: settings.tipSweep
                }, "bycheck");
                Validform.util.abort.call(_this[0]);
                var ajaxsetup = $.extend(true, {}, settings.ajaxurl || {});
                var localconfig = {
                    type: "POST",
                    cache: false,
                    url: ajaxurl,
                    data: "param=" + encodeURIComponent(inputval) + "&name=" + encodeURIComponent($(this).attr("name")),
                    success: function(data) {
                        if ($.trim(data.status) === "y") {
                            inputobj[0].validform_valid = "true";
                            data.info && inputobj.attr("sucmsg", data.info);
                            Validform.util.showmsg.call(curform, inputobj.attr("sucmsg") || curform.data("tipmsg").r || tipmsg.r, settings.tiptype, {
                                obj: inputobj,
                                type: 2,
                                sweep: settings.tipSweep
                            }, "bycheck");
                            _this.removeClass("Validform_error");
                            errorobj = null;
                            if (inputobj[0].validform_subpost == "postform") {
                                curform.trigger("submit");
                            }
                        } else {
                            inputobj[0].validform_valid = data.info;
                            Validform.util.showmsg.call(curform, data.info, settings.tiptype, {
                                obj: inputobj,
                                type: 3,
                                sweep: settings.tipSweep
                            });
                            _this.addClass("Validform_error");
                        }
                        _this[0].validform_ajax = null;
                    },
                    error: function(data) {
                        if (data.status == "200") {
                            if (data.responseText == "y") {
                                ajaxsetup.success({
                                    status: "y"
                                });
                            } else {
                                ajaxsetup.success({
                                    status: "n",
                                    info: data.responseText
                                });
                            }
                            return false;
                        }
                        if (data.statusText !== "abort") {
                            var msg = "status: " + data.status + "; statusText: " + data.statusText;
                            Validform.util.showmsg.call(curform, msg, settings.tiptype, {
                                obj: inputobj,
                                type: 3,
                                sweep: settings.tipSweep
                            });
                            _this.addClass("Validform_error");
                        }
                        inputobj[0].validform_valid = data.statusText;
                        _this[0].validform_ajax = null;
                        return true;
                    }
                };
                if (ajaxsetup.success) {
                    var temp_suc = ajaxsetup.success;
                    ajaxsetup.success = function(data) {
                        localconfig.success(data);
                        temp_suc(data, inputobj);
                    };
                }
                if (ajaxsetup.error) {
                    var temp_err = ajaxsetup.error;
                    ajaxsetup.error = function(data) {
                        localconfig.error(data) && temp_err(data, inputobj);
                    };
                }
                ajaxsetup = $.extend({}, localconfig, ajaxsetup, {
                    dataType: "json"
                });
                _this[0].validform_ajax = $.ajax(ajaxsetup);
                return "ajax";
            } else if (ajaxurl && Validform.util.isEmpty.call($(this), inputval)) {
                Validform.util.abort.call(_this[0]);
                _this[0].validform_valid = "true";
            }
            if (!bool) {
                Validform.util.showmsg.call(curform, flag.info, settings.tiptype, {
                    obj: $(this),
                    type: flag.type,
                    sweep: settings.tipSweep
                }, "bycheck");
                _this.removeClass("Validform_error");
            }
            errorobj = null;
            return true;
        },
        submitForm: function(settings, flg, url, ajaxPost, sync) {
            var curform = this;
            if (curform[0].validform_status === "posting") {
                return false;
            }
            if (settings.postonce && curform[0].validform_status === "posted") {
                return false;
            }
            var beforeCheck = settings.beforeCheck && settings.beforeCheck(curform);
            if (beforeCheck === false) {
                return false;
            }
            var flag = true, inflag;
            curform.find("[datatype]").each(function() {
                if (flg) {
                    return false;
                }
                if (settings.ignoreHidden && $(this).is(":hidden") || $(this).data("dataIgnore") === "dataIgnore") {
                    return true;
                }
                var inputval = Validform.util.getValue.call(curform, $(this)), _this;
                errorobj = _this = $(this);
                inflag = Validform.util.regcheck.call(curform, $(this).attr("datatype"), inputval, $(this));
                if (!inflag.passed) {
                    Validform.util.showmsg.call(curform, inflag.info, settings.tiptype, {
                        obj: $(this),
                        type: inflag.type,
                        sweep: settings.tipSweep
                    });
                    _this.addClass("Validform_error");
                    if (!settings.showAllError) {
                        _this.focus();
                        flag = false;
                        return false;
                    }
                    flag && (flag = false);
                    return true;
                }
                if ($(this).attr("ajaxurl") && !Validform.util.isEmpty.call($(this), inputval)) {
                    if (this.validform_valid !== "true") {
                        var thisobj = $(this);
                        Validform.util.showmsg.call(curform, curform.data("tipmsg").v || tipmsg.v, settings.tiptype, {
                            obj: thisobj,
                            type: 3,
                            sweep: settings.tipSweep
                        });
                        _this.addClass("Validform_error");
                        thisobj.trigger("blur", [ "postform" ]);
                        if (!settings.showAllError) {
                            flag = false;
                            return false;
                        }
                        flag && (flag = false);
                        return true;
                    }
                } else if ($(this).attr("ajaxurl") && Validform.util.isEmpty.call($(this), inputval)) {
                    Validform.util.abort.call(this);
                    this.validform_valid = "true";
                }
                Validform.util.showmsg.call(curform, inflag.info, settings.tiptype, {
                    obj: $(this),
                    type: inflag.type,
                    sweep: settings.tipSweep
                });
                _this.removeClass("Validform_error");
                errorobj = null;
            });
            if (settings.showAllError) {
                curform.find(".Validform_error:first").focus();
            }
            if (flag) {
                var beforeSubmit = settings.beforeSubmit && settings.beforeSubmit(curform);
                if (beforeSubmit === false) {
                    return false;
                }
                curform[0].validform_status = "posting";
                if (settings.ajaxPost || ajaxPost === "ajaxPost") {
                    var ajaxsetup = $.extend(true, {}, settings.ajaxpost || {});
                    ajaxsetup.url = url || ajaxsetup.url || settings.url || curform.attr("action");
                    Validform.util.showmsg.call(curform, curform.data("tipmsg").p || tipmsg.p, settings.tiptype, {
                        obj: curform,
                        type: 1,
                        sweep: settings.tipSweep
                    }, "byajax");
                    if (sync) {
                        ajaxsetup.async = false;
                    } else if (sync === false) {
                        ajaxsetup.async = true;
                    }
                    if (ajaxsetup.success) {
                        var temp_suc = ajaxsetup.success;
                        ajaxsetup.success = function(data) {
                            settings.callback && settings.callback(data);
                            curform[0].validform_ajax = null;
                            if ($.trim(data.status) === "y") {
                                curform[0].validform_status = "posted";
                            } else {
                                curform[0].validform_status = "normal";
                            }
                            temp_suc(data, curform);
                        };
                    }
                    if (ajaxsetup.error) {
                        var temp_err = ajaxsetup.error;
                        ajaxsetup.error = function(data) {
                            settings.callback && settings.callback(data);
                            curform[0].validform_status = "normal";
                            curform[0].validform_ajax = null;
                            temp_err(data, curform);
                        };
                    }
                    var localconfig = {
                        type: "POST",
                        async: true,
                        data: curform.serializeArray(),
                        success: function(data) {
                            if ($.trim(data.status) === "y") {
                                curform[0].validform_status = "posted";
                                Validform.util.showmsg.call(curform, data.info, settings.tiptype, {
                                    obj: curform,
                                    type: 2,
                                    sweep: settings.tipSweep
                                }, "byajax");
                            } else {
                                curform[0].validform_status = "normal";
                                Validform.util.showmsg.call(curform, data.info, settings.tiptype, {
                                    obj: curform,
                                    type: 3,
                                    sweep: settings.tipSweep
                                }, "byajax");
                            }
                            settings.callback && settings.callback(data);
                            curform[0].validform_ajax = null;
                        },
                        error: function(data) {
                            var msg = "status: " + data.status + "; statusText: " + data.statusText;
                            Validform.util.showmsg.call(curform, msg, settings.tiptype, {
                                obj: curform,
                                type: 3,
                                sweep: settings.tipSweep
                            }, "byajax");
                            settings.callback && settings.callback(data);
                            curform[0].validform_status = "normal";
                            curform[0].validform_ajax = null;
                        }
                    };
                    ajaxsetup = $.extend({}, localconfig, ajaxsetup, {
                        dataType: "json"
                    });
                    curform[0].validform_ajax = $.ajax(ajaxsetup);
                } else {
                    if (!settings.postonce) {
                        curform[0].validform_status = "normal";
                    }
                    var url = url || settings.url;
                    if (url) {
                        curform.attr("action", url);
                    }
                    return settings.callback && settings.callback(curform);
                }
            }
            return false;
        },
        resetForm: function() {
            var brothers = this;
            brothers.each(function() {
                this.reset && this.reset();
                this.validform_status = "normal";
            });
            brothers.find(".Validform_right").text("");
            brothers.find(".passwordStrength").children().removeClass("bgStrength");
            brothers.find(".Validform_checktip").removeClass("Validform_wrong Validform_right Validform_loading");
            brothers.find(".Validform_error").removeClass("Validform_error");
            brothers.find("[datatype]").removeData("cked").removeData("dataIgnore").each(function() {
                this.validform_lastval = null;
            });
            brothers.eq(0).find("input:first").focus();
        },
        abort: function() {
            if (this.validform_ajax) {
                this.validform_ajax.abort();
            }
        }
    };
    $.Datatype = Validform.util.dataType;
    Validform.prototype = {
        dataType: Validform.util.dataType,
        eq: function(n) {
            var obj = this;
            if (n >= obj.forms.length) {
                return null;
            }
            if (!(n in obj.objects)) {
                obj.objects[n] = new Validform($(obj.forms[n]).get(), {}, true);
            }
            return obj.objects[n];
        },
        resetStatus: function() {
            var obj = this;
            $(obj.forms).each(function() {
                this.validform_status = "normal";
            });
            return this;
        },
        setStatus: function(status) {
            var obj = this;
            $(obj.forms).each(function() {
                this.validform_status = status || "posting";
            });
            return this;
        },
        getStatus: function() {
            var obj = this;
            var status = $(obj.forms)[0].validform_status;
            return status;
        },
        ignore: function(selector) {
            var obj = this;
            var selector = selector || "[datatype]";
            $(obj.forms).find(selector).each(function() {
                $(this).data("dataIgnore", "dataIgnore").removeClass("Validform_error");
            });
            return this;
        },
        unignore: function(selector) {
            var obj = this;
            var selector = selector || "[datatype]";
            $(obj.forms).find(selector).each(function() {
                $(this).removeData("dataIgnore");
            });
            return this;
        },
        addRule: function(rule) {
            var obj = this;
            var rule = rule || [];
            for (var index = 0; index < rule.length; index++) {
                var o = $(obj.forms).find(rule[index].ele);
                for (var attr in rule[index]) {
                    attr !== "ele" && o.attr(attr, rule[index][attr]);
                }
            }
            $(obj.forms).each(function() {
                var $this = $(this);
                Validform.util.enhance.call($this, this.settings.tiptype, this.settings.usePlugin, this.settings.tipSweep, "addRule");
            });
            return this;
        },
        ajaxPost: function(flag, sync, url) {
            var obj = this;
            $(obj.forms).each(function() {
                if (this.settings.tiptype == 1 || this.settings.tiptype == 2 || this.settings.tiptype == 3) {
                    creatMsgbox();
                }
                Validform.util.submitForm.call($(obj.forms[0]), this.settings, flag, url, "ajaxPost", sync);
            });
            return this;
        },
        submitForm: function(flag, url) {
            var obj = this;
            $(obj.forms).each(function() {
                var subflag = Validform.util.submitForm.call($(this), this.settings, flag, url);
                subflag === undef && (subflag = true);
                if (subflag === true) {
                    this.submit();
                }
            });
            return this;
        },
        resetForm: function() {
            var obj = this;
            Validform.util.resetForm.call($(obj.forms));
            return this;
        },
        abort: function() {
            var obj = this;
            $(obj.forms).each(function() {
                Validform.util.abort.call(this);
            });
            return this;
        },
        check: function(bool, selector) {
            var selector = selector || "[datatype]", obj = this, curform = $(obj.forms), flag = true;
            curform.find(selector).each(function() {
                Validform.util.check.call(this, curform, "", bool) || (flag = false);
            });
            return flag;
        },
        config: function(setup) {
            var obj = this;
            setup = setup || {};
            $(obj.forms).each(function() {
                var $this = $(this);
                this.settings = $.extend(true, this.settings, setup);
                Validform.util.enhance.call($this, this.settings.tiptype, this.settings.usePlugin, this.settings.tipSweep);
            });
            return this;
        }
    };
    $.fn.Validform = function(settings) {
        return new Validform(this, settings);
    };
    function setCenter(obj, time) {
        var left = ($(window).width() - obj.outerWidth()) / 2, top = ($(window).height() - obj.outerHeight()) / 2, top = (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + (top > 0 ? top : 0);
        obj.css({
            left: left
        }).animate({
            top: top
        }, {
            duration: time,
            queue: false
        });
    }
    function creatMsgbox() {
        if ($("#Validform_msg").length !== 0) {
            return false;
        }
        msgobj = $('<div id="Validform_msg"><div class="Validform_title">' + tipmsg.tit + '<a class="Validform_close"href="javascript:void(0);">&chi;</a></div><div class="Validform_info"></div><div class="iframe"><iframe frameborder="0" scrolling="no" height="100%" width="100%"></iframe></div></div>').appendTo("body");
        msgobj.find("a.Validform_close").click(function() {
            msgobj.hide();
            msghidden = true;
            if (errorobj) {
                errorobj.focus().addClass("Validform_error");
            }
            return false;
        }).focus(function() {
            this.blur();
        });
        $(window).bind("scroll resize", function() {
            !msghidden && setCenter(msgobj, 400);
        });
    }
    $.Showmsg = function(msg) {
        creatMsgbox();
        Validform.util.showmsg.call(win, msg, 1, {});
    };
    $.Hidemsg = function() {
        msgobj.hide();
        msghidden = true;
    };
})(jQuery, window);